package expansion.beanPostProcessor;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    // 实例化 Bean 之前调用 （Bean构造函数前）
    // 这个方法用来在对象实例化前直接返回一个对象（如代理对象）来代替通过内置的实例化流程创建对象
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        System.out.println("MyInstantiationAwareBeanPostProcessor-postProcessBeforeInstantiation");
        return null;
    }

    // 实例化 Bean 之后调用
    // 在对象实例化完毕执行 populateBean 之前 如果返回 false 则 spring 不再对对应的 bean 实例进行自动依赖注入
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        System.out.println("MyInstantiationAwareBeanPostProcessor-postProcessAfterInstantiation");
        return true;
    }

    // 这里是在 spring 处理完默认的成员属性，应用到指定的 bean 之前进行回调，可以用来检查和修改属性，最终返回的 PropertyValues 会应用到 bean 中
    // @Autowired、@Resource 等就是根据这个回调来实现最终注入依赖的属性的
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        return null;
    }
}